package app.database;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import oracle.jdbc.OraclePreparedStatement;
import oracle.jdbc.OracleResultSet;
import oracle.ord.im.OrdImage;

/**
 *
 * @author
 * Lukáš Marek
 */
public class InitDatabase
{
	private MainDatabase db;
	
	public InitDatabase(MainDatabase db)
	{
		this.db = db;
	}
	
	public void start()
	{
		createMultimedial();
		createSpatial();
		createFunctions();
	}
	
	public void createMultimedial()
	{
		System.out.println("Vytváření multimediální databáze");

		try
		{
			System.out.println("Mazání multimediální tabulky..");
			db.executeUpdate("DROP TABLE MONSTER_TAB");
			db.executeUpdate("DROP SEQUENCE monsterID_s");
			System.out.println("Tabulka SMAZÁNA.");
			
			System.out.println("VYTVÁŘENÍ Multimediální tabulky..");
			db.executeUpdate("CREATE table MONSTER_TAB"
											+"(id number not NULL,"
											+" name VARCHAR(30),"
											+" lvl number,"
											+" description nVarchar2(600),"
											+" picture ORDSYS.ORDImage, "
											+" primary key (id) )");
			db.executeUpdate("CREATE SEQUENCE monsterID_s START WITH 50 INCREMENT BY 1");
			db.executeUpdate("CREATE TRIGGER monsterID_t BEFORE INSERT ON MONSTER_TAB"
                        +" FOR EACH ROW"
                        +" BEGIN"
                        +" SELECT monsterID_s.nextval INTO :NEW.id FROM dual;"
                        +" END;");
			System.out.println("Tabulka VYTVOŘENA");
			initMultimedial();
		}
		catch (SQLException ex)
		{
			System.err.println("Chyba");
		}
		System.out.println("Ukončeno vytváření multimediální databáze");
	}
	
	private void initMultimedial()
	{
		int id;
		try
		{
			System.out.println("ZAČALA INICIALIZACE MULTIMEDIALNI DATABÁZE..");
			id=addMonster("Medvěd Hnědý", 7, 60,
									"Jedná se o v přírodě se běžně vyskytující druh všežravce."
									+ " Ve většině případů bývá agresivní a při útoku na protivníka"
									+ " se spoléhá na brutální sílu svých tlap a silných čelistí."
									);
					addMonsterImage(id,"animal_bear_brown.jpg");

			id=addMonster("Prase Divoké", 3, 30,
									"Divoká prasata jsou malá agresivní zvířata, která se Vás "
									+ "na potkání pokusí roztrhat svými kly. Pokud má dobrodruh "
									+ "dostatečně silnou zbroj, nepředstavují pro něj však žádné"
			+ "vážné nebezpečí."
									);
					addMonsterImage(id,"animal_boar.jpg");

			id=addMonster("Srnka", 1, 1,
									"Srnky jsou plachá stvoření vyskytující se ve volné přírodě."
									+ " Často se pohybují ve stádech po dvou nebo třech kusech."
									+ " Lovci je vyhledávají jako zdroj kvalitních kožešin a masa."
									);
					addMonsterImage(id,"animal_deer.jpg");

			id=addMonster("Kůň", 1, 10,
									"Obvykle se jedná o plachá zvířata vyskytující se ve stádech."
									+ " Ochočení divokého koně je téměř nemožné, protože se pohybují"
									+ " velmi rychle. Lze však potkat i válečné koně, kteří jsou"
									+ " známí svoji agresivitou, kousáním a kopáním v boji."
									);
					addMonsterImage(id,"animal_horse.jpg");

			id=addMonster("Krab Bahnitý", 2, 15,
									"Jedná se o malý druh predátora číhající v bahnité půdě nedaleko"
									+ " vodních toků. Často se odváží zaútočit i na mnohem větší"
									+ " kořist pomocí svých silných klepet. Naštěstí se pohybují"
									+ " velmi pomalu, což z nich činí snadný terč při použití"
									+ " střelných zbraní nebo kouzel."
									);
					addMonsterImage(id,"animal_mudcrab.jpg");

			id=addMonster("Puma Horská", 10, 75,
									"Asi nejnebezpečnější, ve volné přírodě se vyskytující predátor"
									+ ", který dokáže usmrtit i dobře vyzbrojeného dobrodruha. "
									+ "Umí se velmi rychle přiblížit ke kořisti, kterou napadne "
									+ "sérií rychlých útoků, proti kterým se dá jen těžko ubránit. "
									);
					addMonsterImage(id,"animal_puma.jpg");

			id=addMonster("Vlk", 6, 50,
									"Jednotliví vlci nepředstavují výrazné nebezpečí. Naneštěstí"
									+ " se vyskytují téměř výhradně ve smečkách, ve kterých dokáží "
									+ "uštvat i mnohem silnější kořist, než jsou oni sami. Často "
									+ "jejich útoku předchází vlčí vytí, kterým se svolávají k útoku."
									);
					addMonsterImage(id,"animal_wolf.jpg");

			id=addMonster("Ledový golem", 15, 75,
									"Ledový golem vyniká narozdíl od ostatních golemů především v "
									+ "boji nablízko, kde využívá svou obrovskou výdrž a drtivé "
									+ "útoky pomocí kusů ledu na rukou. Je rezistentní na mráz, ale "
									+ "zranitelný vůči ohni, proto se doporučuje používat právě "
									+ "druh destrukční magie. I přesto představuje velmi silného "
									+ "protivníka i pro nejzkušenější dobrodruhy."
									);
					addMonsterImage(id,"daedra_atronach_frost.jpg");

			id=addMonster("Bouřný golem", 17, 80,
									"Bouřný golem vypadá jako masa rozpohybovaného kamení, unášená "
									+ "vírem vzduchu a blesků. Je považován za nejsilnějšího z "
									+ "golemů. Útočí většinou z dálky pomocí mocných bleskových "
									+ "výbojů. Narozdíl od jiných druhů golemů nemá slabinu na žádný "
									+ "element, ale má imunitu na elektřinu, která ho navíc uzdravuje."
									);
					addMonsterImage(id,"daedra_atronach_storm.jpg");

			id=addMonster("Hrůzňák", 12, 60,
									"Mezi daedrami jsou povážováni na největší zabijáky mágů."
									+ " Dremoří válečníci je používájí pro lov kořisti díky tomu, "
									+ "že se dokáží mimořádně rychle pohybovat a útočit pomocí silného "
									+ "zobáku a spárů. Avšak pro silně opancéřované nepřátele "
									+ "nepředstavují nijak vážnou hrozbu."
									);
					addMonsterImage(id,"daedra_clanfear.jpg");

			id=addMonster("Plamenný golem", 13, 65,
									"Jedná se o nejslabšího z golemů. Útočí převážně na dálku pomocí"
									+ " středně silných ohnivých koulí. Na blízko však bývá snadno"
									+ " zranitelný, stejně jako mrazivými kouzly. Přesto dokáže "
									+ "z větší vzdálenosti nebo zadních řad nepřátel napachát "
									+ "značné škody."
									);
					addMonsterImage(id,"deadra_atronach_flame.jpg");

			id=addMonster("Dremorský těžkooděnec", 20, 85,
									"Hlavní bojovou sílu dremorských sil tvoří právě těžkooděnci."
									+ " Jejich hlavní výhodou je daedrická zbroj a štít, díky kterým "
									+ "dokáží pohltit obrovská zranění, než padnou. Jejich daedrické "
									+ "jednoruční meče dokáží projít téměř jakoukoliv zbrojí bez "
									+ "větších potíží. Naštěstí se vyskytují pouze v oblastech bran "
									+ "Oblivionu."
									);
					addMonsterImage(id,"dremora_armored.jpg");

			id=addMonster("Dremorský rytíř", 20, 95,
									"Elita mezi dremorskými armádami. Zoosobnění destrukce armád "
									+ "Oblivionu. Jsou vybavení neproniknutelnými daedrickými zbrojemi "
									+ "a těžkými obouručními meči, které pronikají kteroukoliv zbrojí "
									+ "jako nůž máslem. Jedná se nejspíše o nejtěžší nepřátele, na "
									+ "které vůbec lze narazit."
									);
					addMonsterImage(id,"dremora_melee.jpg");

			id=addMonster("Dremorský lučištník", 20, 90,
									"Narozdíl od svých kolegů postrádají dremorští lučištníci "
									+ "učinné zbraně nablízko. To ovšem nahrazují smrtícími daedrickými"
									+ " luky, které dokáží prorazit téměř jakoukoliv ochranu. Stává "
									+ "se tedy často, že k nim útočník nestihne ani dojít. Přitom "
									+ "jsou chráněni daedrickými zbrojemi, které odolají jak šípům "
									+ "tak magii."
									);
					addMonsterImage(id,"dremora_ranged.jpg");

			id=addMonster("Goblin", 5, 35,
									"Jedná se o zakrslá a odpudivá stvoření. Pokud nejsou ve skupinách"
									+ " tak nepředstavují vážnější nebezpečí. Často u sebe nosí "
									+ "užitečné věci, které stihli ukrást předchozím obětem. "
									+ "Nejčastěji žijí v jeskyních."
									);
					addMonsterImage(id,"goblin.jpg");

			id=addMonster("Goblinský válečník", 10, 55,
									"Větší a silnější z goblinů se obvykle stávají válečníky. "
									+ "Díky své agresivitě a častějším útokům ve skupinách bývají "
									+ "vybaveni lepšími zbraněmi a zbrojemi. Největší nebezpečí "
									+ "představují pro nahodné pocestné a hůře bráněné karavany."
									);
					addMonsterImage(id,"goblin_skirmisher.jpg");

			id=addMonster("Goblinský vojevůdce", 15, 80,
									"Nejmocnější z goblinských válečníků se stavají vojevůdci. Ti "
									+ "obvykle velí armádě válečníků, kteří plní jejich příkazy. "
									+ "Dostávají nejlepší vybavení ze získané kořisti, což s jejich"
									+ " silou a houževnatostí tvoří velmi nebezpečnou kombinaci. "
									+ "Téměř nikdy se nevyskytují sami, proto když je dobrodruh spatří, "
									+ "měl by rychle utíkat."
									);
					addMonsterImage(id,"goblin_warlord.jpg");

			id=addMonster("Imp", 3, 15,
									"Většinou poměrně neškodná, často i neagresivní stvoření. "
									+ "Vyskytují se volné přírodě většinou kolem magických ruin "
									+ "nebo jiných míst s vysokým soustředěním moci. Někteří mágové"
									+ " jsou známi tím, že si občas nějakého ochočí a využívají je "
									+ "jako tiché společníky při své práci."
									);
					addMonsterImage(id,"monster_imp.jpg");

			id=addMonster("Minotaur", 15, 75,
									"Obrovské rohaté stvoření s kopyty a obouruční sekerou obvykle "
									+ "nevěští nic dobrého. Skolit minotaura bývá ve většině "
									+ "Tamrielu považováno za mistrovský kousek a proto bývají "
									+ "chytáni a využíváni při gladiátorských soutěžích té nejvyšší "
									+ "úrovně. Často bývají vyzbrojeni dwemerskými zbraněmi, což "
									+ "v kombinaci s jejich obrovskou silou znamená pro většinu dobrodruhů"
									+ " velké nebezpečí."
									);
					addMonsterImage(id,"monster_minotaur.jpg");

			id=addMonster("Obr", 19, 90,
									"Obrovské stvoření připomíná horu svalů, která se nejraději "
									+ "živý právě lidským masem. Jejich silná kůže dokáže odolat "
									+ "velké většině útoků. Naštěstí je jejich slabinou relativně "
									+ "malá rychlost a nemotornost, kdy se utočníkům může "
									+ "povést je rychlými útoky utlouci k smrti. Avšak stačí jeden "
									+ "zásah jejich mocnými prackami k tomu, aby rozdtil většině "
									+ "stvoření kosti na prach. Boj na blížko se proto nedoporučuje."
									);
					addMonsterImage(id,"monster_ogre.jpg");

			id=addMonster("Troll", 16, 75,
									"Toto teritoriální monstrum si často vybírá pro svůj život "
									+ "opuštěné jeskyně nebo skalní převisy. Dokud vetřelec nevkročí "
									+ " na jejich území, nebývájí většinou příliš agresivní."
									+ " Když však dojde k boji, útočí rychle a nemilosrdně svými silnými"
									+ " prackami, jež způsobily smrt nejednoho dobrodruha."
									);
					addMonsterImage(id,"monster_troll.jpg");

			id=addMonster("Duch", 5, 25,
									"Nejčasteji lze na duchy narazit v prastarých katakombách, kde "
									+ "se vyskytují jako fyzické manifestace zemřelých. Útočí obvykle "
									+ "pomocí smrtelného chladu svým dotykem. Nepředstavují však "
									+ "vážnější hrozbu, pokud má dobrodruh odpovídající výbavu. Lze "
									+ "je totiž zranit pouze stříbrnými nebo očarovanými zbraněmi."
									);
					addMonsterImage(id,"undead_ghost.jpg");

			id=addMonster("Lich", 20, 95,
									"Nejmocnější z nemrtvých. Jedná se zemřelé máguse, nejčastěji "
									+ "nekromancery, kteří po smrti vstávají z hrobů, aby veleli "
									+ "armádám nemrtvých. Jsou velice houževnatí, ovládájí smrtící "
									+ "magické schopnosti a znají spousty kleteb, které dokáží "
									+ "jejich oběti oslabit nebo rovnou zahubit. Navíc mohou na "
									+ "pomoc vyvolávat okolní nemrtvé, kteří za ně bez obav položí "
									+ "svůj neživot."
									);
					addMonsterImage(id,"undead_lich.jpg");

			id=addMonster("Kostlivec", 4, 30,
									"Jedná se o černou magií rozpohybované kosti, které se řídí "
									+ "zlou vůlí, která je probudila. Nanávidí proto živé a vrhají "
									+ "se na ně vyzbrojeni zeleznými a ocelovými zbraněmi. Naštěstí "
									+ "nemají velkou výdrž a obzvláště drtivé zbraně si dokáží "
									+ "s jednotlivými protivníky hravě poradit."
									);
					addMonsterImage(id,"undead_skeleton.jpg");

			id=addMonster("Kostlivec obránce", 10, 55,
									"Za života byli elitní vojáci a žoldnéři, ve smrti se vrací "
									+ "mezí živé jako kostlivý obránci. Bývají mnohem lépe vyzbrojeni"
									+ " než běžní kostlivci, a představují tak pro většinu dobrodruhů"
									+ " nepříjemné protivníky. Jejich válečnícké schopnosti jim "
									+ "přetrvaly i do posmrtného života"
									);
					addMonsterImage(id,"undead_skeleton_guardian.jpg");

			id=addMonster("Přízrak", 13, 65,
									"Tyto nebezpečné nemrtvé kreatury se nejčastěji vyskytují ve "
									+ "starobylých kobkách a jeskyních. Jedná se o duše zemřelých "
									+ "mágů, které i po smrti působí zkázu a bolest. Jejich nejsilnější "
									+ "zbraní bývají vržená prokletí, která dokáží oslabit jak tělo"
									+ " tak mysl. Navíc jsou nezratilelní běžnými zbraněmi. Je proto"
									+ " nutností se při boji s nimi vybavit stříbrnými nebo očarovanými"
									+ " zbraněmi. Další alternativou je použití magie."
									);
					addMonsterImage(id,"undead_wraith.jpg");

									id=addMonster("Zombie", 5, 35,
									"Podobně jako kostlivec i zombie je oživené tělo zemřelého. V "
									+ "tomto případě však nedávno zesnulého nebo nabalzamovaného. "
									+ "Oproti kostlivcům se vyznačují větší houževnatostí vůči "
									+ "přímým útokům, avšak nedokáží se tak rychle pohybovat nebo "
									+ "používat zbraně. Přesto ve větších počtech dokáží způsobit "
									+ "vážné potíže."
									);
					addMonsterImage(id,"undead_zombie.jpg");

			id=addMonster("Bezhlavá zombie", 16, 75,
									"Nejodolnější ze zombií jsou právě ty bezhlavé. U nich je temná"
									+ " energie, která je oživila natolik silná, že dokáží jednat "
									+ "a vycítit nepřítele i bez nutnost nervové soustavy. Necítí "
									+ "proto bolest a jedinou možností jak je zabít je rozsekání "
									+ "na kousíčky nebo použití destruktivní magie. Navíc jim "
									+ "energie která je oživila dodává nadlidskou sílu. Boj s nimi "
									+ "se doporučuje pouze velmi zkušeným dobrodruhům nebo mágům."
									);
					addMonsterImage(id,"undead_zombie_headless.jpg");
     
         
				System.out.println("INICIALIZACE MULTIMEDIALNI DATABÁZE DOKONČENA");			
        }
				catch(SQLException ex)
        {
					System.err.println("Chyba");
        }
    }
	
	public int addMonster(String name,int lvl,int difficulty,String description) throws SQLException   
	{
		ResultSet res;
		db.executeUpdate("insert into monster_tab"
					 +"(name,lvl,description,picture) values "
					 +"('" + name + "'," + lvl + ",'" + description + "',ORDSYS.ORDImage.init())");
		res = db.executeQuery("select monsterID_s.currval from dual");
		int id;
		res.next();
		id = res.getInt("currval");
		System.out.println("Do databaze byla pridana nestvura \"" + name + "\" s id: " + id);
		return id;
	}

	public void addMonsterImage(int monster_id, String filename)
	{
		try
		{
			OracleResultSet rset;
			OraclePreparedStatement pstmt;
			OrdImage imgProxy;
			boolean autoCommit = db.conn.getAutoCommit();
			try 
			{
				db.conn.setAutoCommit(false);
				String Stmt = "SELECT picture FROM monster_tab WHERE id = " + monster_id + " for update";

				rset = (OracleResultSet)db.executeQuery(Stmt);
				rset.next();
				imgProxy = (OrdImage) rset.getORAData("picture", OrdImage.getORADataFactory());
				rset.close();

				imgProxy.loadDataFromFile("data/" + filename);
				imgProxy.setProperties();

				pstmt = (OraclePreparedStatement) db.conn.prepareStatement("UPDATE monster_tab SET picture = ? WHERE id = ?");
				pstmt.setORAData(1, imgProxy);
				pstmt.setInt(2, monster_id);
				pstmt.executeUpdate();
				db.conn.commit();
				pstmt.close();
			}
			catch (IOException ex)
			{
				System.err.println(ex.getMessage());
			}
			finally 
			{
				db.conn.setAutoCommit(autoCommit);
			}
    }
    catch(SQLException ex)
    {
			System.err.println("Chyba");
    }
    System.out.println("Do databaze byl pridan obrazek \""+filename+"\" pro nestvuru s id: "+monster_id);
	}

	public void createSpatial()
	{
		System.out.println("Vytváření prostorové a temporální databáze..");
		try
		{
			System.out.println("Mazání map_objects tabulky..");
			db.executeUpdate("DROP TABLE map_objects");
			db.executeUpdate("delete from USER_SDO_GEOM_METADATA where TABLE_NAME='MAP_OBJECTS' and COLUMN_NAME='GEOMETRY'");
			db.executeUpdate("DROP SEQUENCE MapObj_ObjectID_s");
			db.executeUpdate("DROP INDEX objects_idx");
			System.out.println("Tabulka SMAZÁNA.");
			
			System.out.println("VYTVÁŘENÍ map_objects tabulky....");
			db.executeUpdate( "CREATE TABLE map_objects(  "
											+ "object_id NUMBER,"
											+ "type NUMBER,"
											+ "geometry SDO_GEOMETRY,"
											+ "name NVARCHAR2(50) DEFAULT '',"
											+ "date_from  NUMBER DEFAULT 0,"
											+ "date_until NUMBER DEFAULT 500,"
											+ "PRIMARY KEY (object_id))");
			db.executeUpdate("INSERT INTO USER_SDO_GEOM_METADATA VALUES('map_objects','geometry',SDO_DIM_ARRAY(SDO_DIM_ELEMENT('X',0,1800,1),SDO_DIM_ELEMENT('Y',0,1470,1)),NULL)");
			//	sekvence a trigger pro mapu objektu
			db.executeUpdate("CREATE SEQUENCE MapObj_ObjectID_s START WITH 50 INCREMENT BY 1");
			db.executeUpdate("CREATE TRIGGER MapObj_ObjectID_t BEFORE INSERT ON map_objects"
                        +" FOR EACH ROW"
                        +" BEGIN"
                        +" SELECT MapObj_ObjectID_s.nextval INTO :NEW.object_id FROM dual;"
                        +" END;");
			System.out.println("Tabulka VYTVOŘENA.");
			
			System.out.println("Vytvoření prostorových indexů..");
			db.executeUpdate("CREATE INDEX objects_idx ON map_objects(geometry) indextype is MDSYS.SPATIAL_INDEX");
			System.out.println("Vytvoření indexů dokončeno.");
			initSpatial();
		}
		catch (SQLException ex)
		{
			System.err.println("Chyba");
		}
		System.out.println("Ukončeno vytváření prostorové a temporální databáze.");
	}
	
	private void initSpatial()
	{
		System.out.println("INICIALIZACE map_objects...");
		try
		{
			//goblinní klan Drtičů lebek
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (68,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(412,492, 477,557, 412,622)), 'Klan Drtičů lebek', 0, 100)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (68,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(499,434, 563,498, 499,562)), 'Klan Drtičů lebek', 100, 200)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (68,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(509,451, 571,513, 509,575)), 'Klan Drtičů lebek', 200, 250)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (68,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(597,379, 630,412, 597,445)), 'Klan Drtičů lebek', 250, 300)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (68,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(692,391, 723,422, 692,453)), 'Klan Drtičů lebek', 350, 400)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (68,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(746,435, 779,468, 746,501)), 'Klan Drtičů lebek', 400, 450)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (68,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(802,495, 833,526, 802,557)), 'Klan Drtičů lebek', 450, 500)");
			//temná jeskyně a duchové v ní
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1038,668, NULL), NULL, NULL), 'Jeskyně Temných sil', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(964,669, 1040,729, 1105,667, 1059,617, 964,621, 964,669)), 'Přizraky z jeskyně', 250, 500)");
			//obléhání Brumy z Brumské brány
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(995,226, NULL), NULL, NULL), 'Brána u Brumy', 50, 350)");

			//Cesty a stezky
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(696,690, 669,616, 624,588, 581,578, 529,543, 536,494, 564,453, 610,435, 626,409)), 'Zkratka do Skingradu', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(1057,138, 1111,180, 1158,173, 1204,171, 1248,171, 1265,205, 1276,229, 1321,233, 1380,235, 1398,240, 1410,255, 1433,282, 1445,316, 1449,355, 1433,374, 1407,374, 1384,368)), 'Horský průsmyk', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(1433,375, 1407,414, 1410,490, 1394,526, 1378,540, 1371,564, 1381,588, 1403,611, 1411,630, 1407,651, 1375,719, 1345,741)), 'Jezerní vyhlídka', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(1294,1260, 1329,1266, 1399,1269, 1428,1226, 1448,1152, 1465,1114, 1499,1081, 1564,1007, 1609,957, 1616,897, 1534,849, 1477,839, 1425,844, 1386,847, 1353,824)), 'Pohraniční stezka', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(1409,440, 1446,479, 1468,522, 1477,542, 1493,569, 1509,593, 1538,615, 1574,620, 1586,623, 1605,666, 1616,695, 1621,720, 1601,756, 1597,783, 1612,809, 1622,842, 1619,882, 1615,900)), 'Starodávna cesta', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(164,783, 183,727, 197,708, 213,689, 249,674, 284,670, 322,666, 338,645, 346,634, 359,614, 374,598, 396,584, 428,569, 454,558, 477,550, 507,545, 530,539)), 'Pískem zavátá obchodní cesta', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(724,699, 751,727, 757,746, 768,760, 791,770, 826,773, 868,773, 916,777, 965,745, 979,726)), 'Cesta banditů', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2002, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1),SDO_ORDINATE_ARRAY(547,355, 549,334, 565,303, 587,273, 608,250, 622,225, 628,201, 634,177, 653,160, 673,136, 689,110, 696,78)), 'Seveřanská trasa', 0, 500)");

			//Medvědí jeskyně
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (50,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1299,572, NULL), NULL, NULL), 'Medvědí jeskyně', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (50,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1299,528, 1338,567, 1299,606)), 'Medvědí teritorium', 0, 100)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (50,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1243,479, 1329,565, 1243,651)), 'Medvědí teritorium', 200, 500)");

			//Oblasti
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(310,554, 387,661, 495,642, 534,731, 494,778, 415,829, 352,882, 295,907, 224,907, 225,872, 215,834, 163,821, 138,819, 118,792, 105,734, 112,694, 153,634, 229,574, 310,554)), 'Zlaté písky', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(726,845, 783,830, 921,823, 1000,853, 1073,800, 975,746, 896,705, 878,665, 857,638, 756,684, 715,732, 700,771, 685,789, 726,845)), 'Prales', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1351,538, 1512,699, 1351,860)), 'Jezerní krajina', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(745,118, 808,138, 906,108, 997,121, 1018,147, 1155,175, 1233,217, 1321,237, 1422,240, 1468,216, 1470,178, 1423,135, 1383,123, 1315,127, 1248,148, 1210,141, 1152,108, 1092,73, 1027,78, 987,72, 945,46, 928,33, 871,52, 831,70, 795,85, 748,85, 745,118)), 'Horský masiv', 0, 500)");
			//Zvířata
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (53,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(637,445, 740,548, 637,651)), 'Stepní koně', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (51,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),SDO_ORDINATE_ARRAY(706,840, 803,729)), 'Prasata v lese', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (57,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),SDO_ORDINATE_ARRAY(738,142, 911,100)), 'Ledový strážci', 0, 500)");
			//Silnější monstra
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (54,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(1104,578, 1117,619, 1136,647, 1166,673, 1173,715, 1198,750, 1226,760, 1248,752, 1260,722, 1256,696, 1203,705, 1177,628, 1136,593, 1117,553, 1104,578)), 'Vodní krabi', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (54,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(1460,1439, 1421,1388, 1365,1365, 1312,1347, 1280,1320, 1271,1285, 1280,1210, 1275,1144, 1269,1082, 1276,1043, 1276,1024, 1239,1034, 1230,1116, 1245,1159, 1252,1189, 1254,1219, 1265,1259, 1260,1300, 1246,1335, 1278,1379, 1318,1397, 1355,1407, 1378,1394, 1395,1397, 1423,1424, 1460,1439)), 'Bažinní krabi', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (54,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1),SDO_ORDINATE_ARRAY(865,394, 868,409, 864,439, 858,456, 862,477, 881,487, 898,491, 891,504, 872,520, 858,535, 867,557, 872,572, 884,580, 888,563, 882,541, 891,528, 906,515, 915,499, 915,478, 898,466, 889,461, 888,440, 897,421, 906,412, 902,396, 889,389, 877,389, 865,394)), 'Imperiální krabi', 0, 500)");
			//stavení
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(823,767, NULL), NULL, NULL), 'Poustevníkova chatrč', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(694,544, NULL), NULL, NULL), 'Alchymistova laboratoř', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(982,795, NULL), NULL, NULL), 'Lovecký srub', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1646,719, NULL), NULL, NULL), 'Pohraniční pevnost', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(487,745, NULL), NULL, NULL), 'Obchodní stanice', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(236,764, NULL), NULL, NULL), 'Hospoda na zlaté cestě', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(837,276, NULL), NULL, NULL), 'Stáje', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(952,111, NULL), NULL, NULL), 'Mračný chrám', 0, 500)");
			//brány
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1062,192, NULL), NULL, NULL), 'Druhá brána u Brumy', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(921,207, NULL), NULL, NULL), 'Třetí brána u Brumy', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(717,392, NULL), NULL, NULL), 'Choroloská brána', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(499,575, NULL), NULL, NULL), 'Brána v poušti', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(353,761, NULL), NULL, NULL), 'Obří brána nad Kvatch', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(733,728, NULL), NULL, NULL), 'Skingradská brána', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1160,816, NULL), NULL, NULL), 'Bravilská brána', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1312,1307, NULL), NULL, NULL), 'Brána v bažinách', 0, 500)");
			//brána v horách a průchod monster
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1648,745, NULL), NULL, NULL), 'Brána na hranicích', 50, 450)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1641,738, 1665,762, 1641,786)), 'Průchod hrůzňáků branou', 50, 100)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1618,789, 1646,817, 1618,845)), 'Pochod hrůzňáků', 100, 150)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1595,846, 1629,880, 1595,914)), 'Pochod hrůzňáků', 150, 200)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1565,907, 1607,949, 1565,991)), 'Střet s obry a smrt', 200, 350)");

			//pohyb horských pum
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (55,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1421,181, 1449,209, 1421,237)), 'Horské pumy', 0, 100)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (55,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1278,134, 1307,163, 1278,192)), 'Horské pumy', 100, 200)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (55,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1058,79, 1092,113, 1058,147)), 'Horské pumy', 250, 300)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (55,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(763,124, 807,168, 763,212)), 'Horské pumy', 300, 400)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (55,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(583,198, 618,233, 583,268)), 'Horské pumy', 400, 500)");

			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0, SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(819,748, NULL), NULL, NULL), 'Jeskyň v lese', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0, SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(940,554, NULL), NULL, NULL), 'Vstup do stoky', 0, 350)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0, SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(940,554, NULL), NULL, NULL), 'Zasypaná stoka', 350, 500)");

			//dávná hrobka, vzestup liche a armády zombie
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (0,SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(1425,1080, NULL), NULL, NULL), 'Dávná hrobka', 0, 500)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (74,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3),SDO_ORDINATE_ARRAY(1363,1112, 1456,1024)), 'Obránci hrobky', 50, 350)");
			db.executeUpdate("INSERT INTO map_objects (type,geometry,name,date_from,date_until) VALUES (76,SDO_GEOMETRY(2003, NULL,NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 4),SDO_ORDINATE_ARRAY(1402,986, 1470,1054, 1402,1122)), 'Armáda zombie', 350, 500)");

		}
		catch(SQLException ex)
		{
			System.err.println("Chyba");
		}
		System.out.println("INICIALIZACE map_objects DOKONČENA.");
	}

	private void createFunctions()
	{
		System.out.println("Vytvoření databázových funkcí...");
		try
		{
			db.executeQuery("CREATE OR REPLACE\n" +
											"FUNCTION get_si_featurelist (image IN BLOB) RETURN si_featurelist IS\n" +
											"  l_img_obj   si_stillimage;\n" +
											"  l_avgcolor  si_averagecolor;\n" +
											"  l_colorhist si_colorhistogram;\n" +
											"  l_poscolor  si_positionalcolor;\n" +
											"  l_texture   si_texture;\n" +
											"  l_featurelist   si_featurelist;\n" +
											"BEGIN\n" +
											"  l_img_obj := NEW si_stillimage(image);\n" +
											"  l_avgcolor    := NEW si_averagecolor(l_img_obj);\n" +
											"  l_colorhist   := NEW si_colorhistogram(l_img_obj);\n" +
											"  l_poscolor    := NEW si_positionalcolor(l_img_obj);\n" +
											"  l_texture     := NEW si_texture(l_img_obj);\n" +
											"  l_featurelist := NEW si_featurelist(l_avgcolor, 1, l_colorhist, 1, l_poscolor, 1, l_texture, 1);\n" +
											"  RETURN l_featurelist;\n" +
											"END;");
			db.executeQuery("CREATE OR REPLACE TYPE array IS object (id number);");
			db.executeQuery("CREATE OR REPLACE TYPE arrayType IS table of array;");
			db.executeQuery("CREATE OR REPLACE\n" +
											"FUNCTION get_similiar RETURN arrayType IS\n" +
											"  l_emp_tab arrayType := arrayType();\n" +
											"  n integer := 0;\n" +
											"  l_featurelist si_featurelist;\n" +
											"  l_blob BLOB;\n" +
											"BEGIN\n" +
											"  SELECT m.img.source.localdata INTO l_blob FROM testTable m WHERE ROWNUM = 1;\n" +
											"  l_featurelist := get_si_featurelist(l_blob);\n" +
											"  for r in (\n" +
											"    SELECT m.id\n" +
											"    FROM monster_tab m\n" +
											"    WHERE m.picture.contentLength IS NOT NULL AND\n" +
											"    si_scorebyftrlist(l_featurelist, new si_stillimage(m.picture.source.localdata)) < 10)\n" +
											"  LOOP\n" +
											"    l_emp_tab.extend;\n" +
											"    n := n + 1;\n" +
											"    l_emp_tab(n) := array(r.id);\n" +
											"  END LOOP;\n" +
											"  RETURN l_emp_tab;\n" +
											"END;");
		}
		catch (SQLException ex)
		{
			System.err.println("Chyba");
		}
		System.out.println("Vytvoření databázových funkcí DOKONČENO.");
	}
}
